package org.walklink.agent.plugin.impl.link;

import net.bytebuddy.asm.Advice;
import org.walklink.agent.track.TraceInfo;
import org.walklink.agent.track.TrackContext;
import org.walklink.agent.track.TrackManager;

import java.util.UUID;

/**
 * 测试的链接拦截
 *
 * @author lidishan
 */
public class LinkAdvice {

    /**
     * 表示这个方法会在，进入目标方法时调用，这个注解声明的方法必须是static。
     *      当目标的方法是constructor构造器时，@This只能写field，不能读field，或者调用方法
     */
    @Advice.OnMethodEnter()
    public static void enter(@Advice.Origin("#t") String className, @Advice.Origin("#m") String methodName) {
        TraceInfo currentSpan = TrackManager.getCurrentSpan();
        if (null == currentSpan) {
            String linkId = UUID.randomUUID().toString();
            TrackContext.setTraceInfo(new TraceInfo(linkId));
        }
        TrackManager.createEntrySpan();
    }

    /**
     * 表示这个方法会在，目标方法结束时调用，这个注解声明的方法必须是static。如果方法提前终止了，那么这个就不调用
     */
    @Advice.OnMethodExit()
    public static void exit(@Advice.Origin("#t") String className, @Advice.Origin("#m") String methodName) {
        TraceInfo exitSpan = TrackManager.getExitSpan();
        if (null == exitSpan) return;
        System.out.println("LinkAdvice=链路追踪：" + exitSpan.getTraceId() + " " + className + "." + methodName + " 耗时：" + (System.currentTimeMillis() - exitSpan.getEnterTime().getTime()) + "ms");
    }

}